package com.softeem.sanguo;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * 游戏精灵类: 游戏面板中呈现的游戏元素都具备相同类型的信息，这些信息统一可以封装到一个精灵类
 * 玩家
 * 敌人
 * 道具
 * 子弹
 * ..
 * 以上都可以认为是游戏精灵，因为以上元素在界面中呈现都具备相同的一些信息(坐标，尺寸，图片，是否显示等)
 * 封装性（信息隐藏，将类的属性私有化，通过公开的方法访问：setter/getter方法）
 * 抽象类
 * 设计模式-模板方法
 * 构造器使用
 */
public abstract class Sprite {
    /**用于渲染精灵元素的图片对象*/
    private BufferedImage img;
    /**精灵元素在界面中显示的位置：xy轴（坐标）*/
    private int x;
    private int y;
    /**精灵元素在界面中显示占据大小*/
    private int w;
    private int h;
    /**标记精灵元素是否消亡*/
    private boolean death;
    /**声明游戏主面板*/
    private GamePanel panel;

    /**
     * 构造器：在创建对象时执行初始化操作
     */
    public Sprite(GamePanel panel){
        this.panel = panel;
        //执行初始化方法完成对象信息的赋值
        //设计模式之模板方法模式
        init();
    }

    /**
     * 抽象方法
     * 精灵初始化（为精灵元素的属性赋值）
     */
    public abstract void init();

    /**
     * 精灵销毁
     */
    public abstract void destroy();

    /**
     * 精灵元素绘制到指定位置
     * @param g
     */
    public void draw(Graphics g){
        g.drawImage(img,x,y,w,h,null);
    }

    public GamePanel getPanel() {
        return panel;
    }

    public BufferedImage getImg() {
        return img;
    }

    public void setImg(BufferedImage img) {
        this.img = img;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getW() {
        return w;
    }

    public void setW(int w) {
        this.w = w;
    }

    public int getH() {
        return h;
    }

    public void setH(int h) {
        this.h = h;
    }

    public boolean isDeath() {
        return death;
    }

    public void setDeath(boolean death) {
        this.death = death;
    }
}
